package com.huiying.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID; // 用于生成唯一文件名

@Data
@AllArgsConstructor
@Slf4j
public class LocalFileUtil {

    private String uploadBaseDir; // 本地文件上传的根目录

    /**
     * 文件上传到本地目录
     *
     * @param bytes 文件内容的字节数组
     * @param originalFilename 原始文件名，用于提取文件扩展名
     * @return 返回文件的相对路径（相对于 uploadBaseDir），或者文件名
     */
    public String upload(byte[] bytes, String originalFilename) {
        if (bytes == null || bytes.length == 0) {
            log.warn("上传文件内容为空。");
            return null;
        }

        if (originalFilename == null || originalFilename.isEmpty()) {
            originalFilename = "untitled_file"; // 提供一个默认文件名
            log.warn("原始文件名为空，使用默认文件名: {}", originalFilename);
        }

        // 确保上传目录存在
        Path baseDirPath = Paths.get(uploadBaseDir);
        try {
            if (!Files.exists(baseDirPath)) {
                Files.createDirectories(baseDirPath); // 如果目录不存在，则创建
                log.info("创建上传目录: {}", baseDirPath.toAbsolutePath());
            }
        } catch (IOException e) {
            log.error("无法创建上传目录: {}. 错误: {}", uploadBaseDir, e.getMessage());
            return null;
        }

        // 生成唯一的文件名，保留原始文件扩展名
        String fileExtension = "";
        int dotIndex = originalFilename.lastIndexOf('.');
        if (dotIndex > 0 && dotIndex < originalFilename.length() - 1) {
            fileExtension = originalFilename.substring(dotIndex);
        }
        String uniqueFileName = UUID.randomUUID().toString() + fileExtension;
        
        // 构建完整的文件路径
        Path filePath = baseDirPath.resolve(uniqueFileName);

        try (InputStream inputStream = new ByteArrayInputStream(bytes);
             FileOutputStream outputStream = new FileOutputStream(filePath.toFile())) { // 使用File对象
            
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            log.info("文件上传成功，本地路径: {}", filePath.toAbsolutePath());
            return uniqueFileName; // 返回文件名，或者你可以返回完整的绝对路径或相对路径
        } catch (IOException e) {
            log.error("文件上传到本地失败: {}", e.getMessage());
            return null;
        }
    }

    /**
     * 从本地目录下载文件（读取文件内容为字节数组）
     *
     * @param filename 要下载的文件名（相对于 uploadBaseDir 的路径或文件名）
     * @return 文件的字节数组，如果文件不存在或读取失败则返回 null
     */
    public byte[] download(String filename) {
        if (filename == null || filename.isEmpty()) {
            log.warn("下载文件名为空。");
            return null;
        }

        Path filePath = Paths.get(uploadBaseDir).resolve(filename);

        if (!Files.exists(filePath)) {
            log.warn("文件不存在，无法下载: {}", filePath.toAbsolutePath());
            return null;
        }

        try (FileInputStream inputStream = new FileInputStream(filePath.toFile());
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            log.info("文件从本地下载成功: {}", filePath.toAbsolutePath());
            return outputStream.toByteArray();
        } catch (IOException e) {
            log.error("文件从本地下载失败: {}", e.getMessage());
            return null;
        }
    }
}